package com.example.shardingsphere.sharding;

import com.example.shardingsphere.User;
import org.springframework.stereotype.Component;

import java.util.concurrent.atomic.AtomicLong;

/**
 * describe: 简易的用户分片数据处理器
 *
 * @author lianying
 * @date 2023/05/05
 */
@Component
public class UserIdHandler implements ShardingHandler<User,Long> {
    //测试用的  只提供思路
    private AtomicLong atomicLong=new AtomicLong(1);
    //db基数，可考虑动态,这边先写死
    private int dbNum=2;
    //table基数，可考虑动态,这边先写死
    private int tableNum=2;

    /**
     * 总共10位，组成=前缀（10）+db下标(1位)+table下标(1位)+6位自增id
     *
     * @param t
     * @return
     */
    @Override
    public Long createId(User t) {
        return Long.valueOf(10+""+t.getAge()%dbNum+t.getAge()%tableNum+String.format("%06d",atomicLong.incrementAndGet()));
    }

    @Override
    public int getDbIndex(Long id) {

        return Integer.valueOf(String.valueOf(id/10000000%10));
    }

    @Override
    public int getTableIndex(Long id) {
        return Integer.valueOf(String.valueOf(id/1000000%10));
    }
}
